#ifndef __BSP_PWM_OUTPUT_H__
#define __BSP_PWM_OUTPUT_H__

#include <stdint.h>

#include "gd32f4xx.h"  

typedef enum
{
    TIM_CH_0 = TIMER_CH_0,
    TIM_CH_1 = TIMER_CH_1,
    TIM_CH_2 = TIMER_CH_2,
    TIM_CH_3 = TIMER_CH_3
}tim_channel_e;



typedef enum
{
    GPIO_AF_TIMER0_CH_0_PE9   = GPIO_AF_1,  // PE9
    GPIO_AF_TIMER0_CH_0_PA8   = GPIO_AF_1,  // PA8
    GPIO_AF_TIMER0_CHN_0_PB13 = GPIO_AF_1,  // PB13
    GPIO_AF_TIMER0_CHN_0_PE8  = GPIO_AF_1,  // PE8
    GPIO_AF_TIMER0_CHN_0_PA7  = GPIO_AF_1,  // PA7
    GPIO_AF_TIMER0_CH_1_PA9   = GPIO_AF_1,  // PA9
    GPIO_AF_TIMER0_CH_1_PE11  = GPIO_AF_1,  // PE11
    GPIO_AF_TIMER0_CHN_1_PB0  = GPIO_AF_1,  // PB0
    GPIO_AF_TIMER0_CHN_1_PB14 = GPIO_AF_1,  // PB14
    GPIO_AF_TIMER0_CHN_1_PE1  = GPIO_AF_1,  // PE1
    GPIO_AF_TIMER0_CHN_1_PE10 = GPIO_AF_1,  // PE10
    GPIO_AF_TIMER0_CH_2_PA10  = GPIO_AF_1,  // PA10
    GPIO_AF_TIMER0_CH_2_PE13  = GPIO_AF_1,  // PE13
    GPIO_AF_TIMER0_CHN_2_PA10 = GPIO_AF_1,  // PA10
    GPIO_AF_TIMER0_CHN_2_PE12 = GPIO_AF_1,  // PE12
    GPIO_AF_TIMER0_CHN_2_PB15 = GPIO_AF_1,  // PB15
    GPIO_AF_TIMER0_CHN_2_PB1  = GPIO_AF_1,  // PB1
    GPIO_AF_TIMER0_CH_3_PA11  = GPIO_AF_1,  // PA11
    GPIO_AF_TIMER0_CH_3_PE14  = GPIO_AF_1,  // PE14

    GPIO_AF_TIMER1_CH_0_PA0  = GPIO_AF_1,  // PA0
    GPIO_AF_TIMER1_CH_0_PA5  = GPIO_AF_1,  // PA5
    GPIO_AF_TIMER1_CH_0_PA15 = GPIO_AF_1,  // PA15
    GPIO_AF_TIMER1_CH_1_PA1  = GPIO_AF_1,  // PA1
    GPIO_AF_TIMER1_CH_1_PB3  = GPIO_AF_1,  // PB3
    GPIO_AF_TIMER1_CH_2_PA2  = GPIO_AF_1,  // PA2
    GPIO_AF_TIMER1_CH_2_PB10 = GPIO_AF_1,  // PB10
    GPIO_AF_TIMER1_CH_3_PA3  = GPIO_AF_1,  // PA3
    GPIO_AF_TIMER1_CH_3_PB2  = GPIO_AF_1,  // PB2
    GPIO_AF_TIMER1_CH_3_PB11 = GPIO_AF_1,  // PB11
    
    GPIO_AF_TIMER2_CH_0_PA6  = GPIO_AF_2,  // PA6
    GPIO_AF_TIMER2_CH_0_PB4  = GPIO_AF_2,  // PB4
    GPIO_AF_TIMER2_CH_0_PC6  = GPIO_AF_2,  // PC6
    GPIO_AF_TIMER2_CH_1_PA7  = GPIO_AF_2,  // PA7
    GPIO_AF_TIMER2_CH_1_PB5  = GPIO_AF_2,  // PB5
    GPIO_AF_TIMER2_CH_1_PC7  = GPIO_AF_2,  // PC7
    GPIO_AF_TIMER2_CH_2_PB0  = GPIO_AF_2,  // PB0
    GPIO_AF_TIMER2_CH_2_PC8  = GPIO_AF_2,  // PC8
    GPIO_AF_TIMER2_CH_3_PB1  = GPIO_AF_2,  // PB1
    GPIO_AF_TIMER2_CH_3_PC9  = GPIO_AF_2,  // PC9
}pwm_gpio_af_e;

typedef struct
{
    uint32_t      gpio_pin;  /* gpio引脚编号 */
    pwm_gpio_af_e gpio_af;   /* gpio复用编号 */
    uint32_t      gpio_port; /* GPIO端口 */
}pwm_gpio_t;

typedef struct
{
    uint32_t      tim_n;   /* 定时器编号 */
    tim_channel_e tim_ch;  /* 定时器输出通道 */
    EventStatus   enable;  /* 是否使能定时器 */
}pwm_tim_t;

typedef struct
{
    uint32_t freq;        /* PWM信号频率，单位Hz 0 表示禁止输出 */
    uint32_t duty_cycle;  /* PWM信号占空比，单位：万分之一。如5000，表示50.00%的占空比 */
}pwm_param_t;


void bsp_pwm_output(pwm_gpio_t *gpio, pwm_tim_t *tim, pwm_param_t *param);
void bsp_pwm_output_n(pwm_gpio_t *gpio, pwm_tim_t *tim, pwm_param_t *param);

#endif
